<?php

require_once 'BancoDeDados.php';
require_once 'Usuario.php';
require_once 'Endereco.php';
require_once 'Cmdo.php';
require_once 'OM.php';
require_once 'RM.php';
require_once 'TipoEspaco.php';
require_once 'Facilidade.php';
require_once 'FonteRecursos.php';
require_once 'EstadoEspaco.php';

class EspacoCultural {

    private $cod_espaco;
    private $nome;
    private $usuarios;
    private $om;
    private $rm;
    private $cmdo;
    private $endereco;
    private $telefone;
    private $email;
    private $tipo;
    private $area;
    private $facilidades;
    private $fontes_recursos;
    private $estado;
    private $bi;
    private $cadastro_dphcex;
    private $descricao;
    private $funcionamento;
    private $site;
    private $imagens;
    private $vinculado;

    public function &getCod_espaco() {
        return $this->cod_espaco;
    }

    public function setCod_espaco(&$cod_espaco) {
        $this->cod_espaco = &$cod_espaco;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function setNome(&$nome) {
        $this->nome = &$nome;
    }

    public function &getUsuarios() {
        return $this->usuarios;
    }

    public function setUsuarios(&$usuarios) {
        $this->usuarios = &$usuarios;
    }

    /**
     *
     * @return OM
     */
    public function &getOm() {
        return $this->om;
    }

    public function setOm(OM &$om) {
        $this->om = &$om;
    }

    /**
     *
     * @return RM
     */
    public function &getRm() {
        return $this->rm;
    }

    public function setRm(RM &$rm) {
        $this->rm = &$rm;
    }

    /**
     *
     * @return Cmdo
     */
    public function &getCmdo() {
        return $this->cmdo;
    }

    public function setCmdo(&$cmdo) {
        $this->cmdo = &$cmdo;
    }

    /**
     *
     * @return Endereco
     */
    public function &getEndereco() {
        return $this->endereco;
    }

    public function setEndereco(&$endereco) {
        $this->endereco = &$endereco;
    }

    public function &getTelefone() {
        return $this->telefone;
    }

    public function setTelefone(&$telefone) {
        $this->telefone = &$telefone;
    }

    public function &getEmail() {
        return $this->email;
    }

    public function setEmail(&$email) {
        $this->email = &$email;
    }

    /**
     *
     * @return TipoEspaco
     */
    public function &getTipo() {
        return $this->tipo;
    }

    public function setTipo(&$tipo) {
        $this->tipo = &$tipo;
    }

    public function &getArea() {
        return $this->area;
    }

    public function setArea(&$area) {
        $this->area = &$area;
    }

    public function &getFacilidades() {
        return $this->facilidades;
    }

    public function setFacilidades(&$facilidades) {
        $this->facilidades = &$facilidades;
    }

    public function &getFontes_recursos() {
        return $this->fontes_recursos;
    }

    public function setFontes_recursos(&$fonte_recursos) {
        $this->fontes_recursos = &$fonte_recursos;
    }

    /**
     *
     * @return EstadoEspaco
     */
    public function &getEstado() {
        return $this->estado;
    }

    public function setEstado(&$estado) {
        $this->estado = &$estado;
    }

    public function &getBi() {
        return $this->bi;
    }

    public function setBi(&$bi) {
        $this->bi = &$bi;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getCadastro_dphcex() {
        return $this->cadastro_dphcex;
    }

    public function setCadastro_dphcex(&$cadastro_dphcex) {
        $this->cadastro_dphcex = &$cadastro_dphcex;
    }

    public function &getImagens() {
        return $this->imagens;
    }

    public function setImagens(&$imagens) {
        $this->imagens = &$imagens;
    }
    
    public function &getSite() {
        return $this->site;
    }

    public function setSite(&$site) {
        $this->site = &$site;
    }
    
    public function &getFuncionamento() {
        return $this->funcionamento;
    }

    public function setFuncionamento(&$funcionamento) {
        $this->funcionamento = &$funcionamento;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Espaço Cultural existente");
        }

        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into espaco (nome, cod_om, cod_rm, cod_cmdo, telefone, email, cod_tipo_espaco, area, cod_estado_espaco, bi, descricao, cadastro_dphcex, site, funcionamento) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?)');
        $result = $link->execute($stmt, array($this->nome, $this->om->getCod_om(), $this->rm->getCod_rm(), $this->cmdo->getCod_cmdo(), $this->telefone, $this->email, $this->tipo->getCod_tipo_espaco(), $this->area, $this->estado->getCod_estado_espaco(), $this->bi, $this->descricao, $this->cadastro_dphcex, $this->site, $this->funcionamento));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result = $banco->getLink()->query('select cod_espaco from espaco where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $result->fetchInto($row);
        $this->cod_espaco = &$row['cod_espaco'];
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        $resultado = $campo_valor;
        if ($campo_id == 'nome') {
            $temp = &$this->nome;
            $this->nome = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Espaço Cultural existente");
            }
        } elseif ($campo_id == 'cod_om') {
            $temp = &$this->om->getCod_om();
            $this->om = &OM::consultar($campo_valor);
            $resultado = $this->om->getSigla();
        } elseif ($campo_id == 'cod_rm') {
            $temp = &$this->rm->getCod_rm();
            $this->rm = &RM::consultar($campo_valor);
            $resultado = $this->rm->getDescricao();
        } elseif ($campo_id == 'cod_cmdo') {
            $temp = &$this->cmdo->getCod_cmdo();
            $this->cmdo = &Cmdo::consultar($campo_valor);
            $resultado = $this->cmdo->getDescricao();
        } elseif ($campo_id == 'telefone') {
            $temp = &$this->telefone;
            $this->telefone = &$campo_valor;
        } elseif ($campo_id == 'email') {
            $temp = &$this->email;
            $this->email = &$campo_valor;
        } elseif ($campo_id == 'site') {
            $temp = &$this->site;
            $this->site = &$campo_valor;
        } elseif ($campo_id == 'funcionamento') {
            $temp = &$this->funcionamento;
            $this->funcionamento = &$campo_valor;
        } elseif ($campo_id == 'cod_tipo_espaco') {
            $temp = &$this->tipo;
            $this->tipo = &TipoEspaco::consultar($campo_valor);
            $resultado = $this->tipo->getDescricao();
        } elseif ($campo_id == 'cod_estado_espaco') {
            $temp = &$this->estado->getCod_estado_espaco();
            $this->estado = &EstadoEspaco::consultar($campo_valor);
            $resultado = $this->estado->getDescricao();
        } elseif ($campo_id == 'bi' && $this->bi != $campo_valor) {
            $temp = &$this->bi;
            $this->bi = &$campo_valor;
        } elseif ($campo_id == 'cadastro_dphcex') {
            $temp = &$this->cadastro_dphcex;
            $this->cadastro_dphcex = &$campo_valor;
        } elseif ($campo_id == 'descricao') {
            $temp = &$this->descricao;
            $this->descricao = &$campo_valor;
        } elseif ($campo_id == 'logradouro' || $campo_id == 'numero' || $campo_id == 'cidade' || $campo_id == 'estado' || $campo_id == 'cep' || $campo_id == 'bairro' || $campo_id == 'complemento') {
            $resultado = $this->endereco->alterarCampo($campo_id, $campo_valor);
            return $resultado;
        } elseif ($campo_id == 'cod_facilidade') {
            $facilidades_str = explode(",", $campo_valor);
            $facilidades = array();
            if ($campo_valor != null && $campo_valor != "") {
                foreach ($facilidades_str as $facilidade_str) {
                    $facilidade = &Facilidade::consultar($facilidade_str);
                    $facilidades[] = &$facilidade;
                    unset ($facilidade);
                }
            }
            $this->excluirFacilidades();
            foreach ($facilidades as $facilidade) {
                $this->cadastrarFacilidade($facilidade);
            }
            $this->setFacilidades(Facilidade::listarPorEspaco($this));
            return $resultado;
        } elseif ($campo_id == 'cod_fonte_recursos') {
            $fontes_recursos_str = explode(",", $campo_valor);
            $fontes_recursos = array();
            if ($campo_valor != null && $campo_valor != "") {
                foreach ($fontes_recursos_str as $fonte_recursos_str) {
                    $fonte_recursos = &FonteRecursos::consultar($fonte_recursos_str);
                    $fontes_recursos[] = &$fonte_recursos;
                    unset ($fonte_recursos);
                }
            }
            $this->excluirFontesRecursos();
            foreach ($fontes_recursos as $fonte_recursos) {
                $this->cadastrarFonteRecursos($fonte_recursos);
            }
            $this->setFontes_recursos(FonteRecursos::listarPorEspaco($this));
            return $resultado;
        }
        if ($temp == $campo_valor) {
            return;
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update espaco set ' . $campo_id . ' = ? where cod_espaco = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
        return $resultado;
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco where cod_espaco = ?');
        $result = $link->execute($stmt, array($this->cod_espaco));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    /**
     *
     * @return array
     */
    public static function listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select espaco.cod_espaco, nome from espaco order by nome');
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }
    
    /**
     *
     * @return array
     */
    public static function listarByNome($nome_espaco) {
        $nome_espaco = strtoupper($nome_espaco);
        $nome_espaco = "%$nome_espaco%";
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select e.cod_espaco, e.nome from espaco e where upper(e.nome) like ? order by e.nome', array($nome_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }

    /**
     *
     * @return array
     */
    public static function listarByCMDO(&$cmdo) {
        $cmdo = strtoupper($cmdo);
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select e.cod_espaco, e.nome from espaco e, cmdo c where e.cod_cmdo = c.cod_cmdo and c.descricao like ? order by nome', array($cmdo));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }

    /**
     *
     * @param integer $cod_usuario
     * @return array 
     */
    public static function listarPorUsuario(&$cod_usuario) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('SELECT espaco.cod_espaco, nome FROM espaco, usuario_espaco WHERE espaco.cod_espaco = usuario_espaco.cod_espaco and usuario_espaco.cod_usuario = ?', array($cod_usuario));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $espaco = new EspacoCultural();
            $espaco->setCod_espaco($row['cod_espaco']);
            $espaco->setNome($row['nome']);
            $resultado[$row['cod_espaco']] = &$espaco;
            unset($espaco);
        }
        return $resultado;
    }

    /**
     *
     * @param integer $cod_espaco
     * @return EspacoCultural 
     */
    public static function consultar(&$cod_espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from espaco where cod_espaco = ?', array($cod_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Espaço Cultural inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Espaço Cultural com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $espaco = new EspacoCultural();
        $espaco->setCod_espaco($row['cod_espaco']);
        $espaco->setArea($row['area']);
        $espaco->setBi($row['bi']);
        $espaco->setCmdo(Cmdo::consultar($row['cod_cmdo']));
        $espaco->setDescricao($row['descricao']);
        $espaco->setEmail($row['email']);
        $espaco->setEndereco(Endereco::consultarPorEspaco($row['cod_espaco']));
        $espaco->setEstado(EstadoEspaco::consultar($row['cod_estado_espaco']));
        $espaco->setNome($row['nome']);
        $espaco->setFuncionamento($row['funcionamento']);
        $espaco->setSite($row['site']);
        $espaco->setOm(OM::consultar($row['cod_om']));
        $espaco->setRm(RM::consultar($row['cod_rm']));
        $espaco->setTelefone($row['telefone']);
        $espaco->setCadastro_dphcex($row['cadastro_dphcex']);
        $espaco->setTipo(TipoEspaco::consultar($row['cod_tipo_espaco']));
        //$espaco->setUsuarios(Usuario::listarPorEspaco($row['cod_espaco']));
        //$espaco->setVinculado($espaco->verificarVinculacao());
        $espaco->setFacilidades(Facilidade::listarPorEspaco($espaco));
        $espaco->setFontes_recursos(FonteRecursos::listarPorEspaco($espaco));
        return $espaco;
    }
    
    /**
     *
     * @param string $nome_espaco
     * @return EspacoCultural 
     */
    public static function consultarByNome(&$nome_espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_espaco from espaco where nome = ?', array($nome_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Espaço Cultural inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Espaço Cultural com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $espaco = new EspacoCultural();
        $espaco->setCod_espaco($row['cod_espaco']);
        return $espaco;
    }

    /**
     *
     * @param integer $cod_interno
     * @return EspacoCultural 
     */
    public static function consultarPorObjeto(&$cod_interno) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select espaco.cod_espaco, nome from espaco, objeto where espaco.cod_espaco = objeto.cod_espaco and cod_interno = ?', array($cod_interno));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() == 0) {
            throw new Exception("Espaço Cultural inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de uma Espaço Cultural com o mesmo identificador, informar ao administrador");
        }
        $result->fetchInto($row);
        $espaco = new EspacoCultural();
        $espaco->setCod_espaco($row['cod_espaco']);
        $espaco->setNome($row['nome']);
        return $espaco;
    }

    private function validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_espaco from espaco where nome = ? and cod_espaco <> ?', array($this->nome, $this->cod_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return 0;
        }
        return 1;
    }

    private function verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('SELECT espaco.cod_espaco FROM espaco, usuario_espaco, objeto WHERE espaco.cod_espaco = ? AND (espaco.cod_espaco = usuario_espaco.cod_espaco OR  objeto.cod_espaco = espaco.cod_espaco)', array($this->cod_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return 1;
        }
        return 0;
    }

    public function cadastrarUsuario(Usuario &$usuario) {
        if (!$this->usuarios[$usuario->getCod_usuario()] instanceof Usuario) {
            $usuario->cadastrarEspaco($this);
            $this->usuarios[$usuario->getCod_usuario()] = &$usuario;
        }
    }

    public function excluirUsuario(&$cod_usuario) {
        if ($this->usuarios[$cod_usuario] instanceof Usuario) {
            $this->usuarios[$cod_usuario]->excluirEspaco($this);
            unset($this->usuarios[$cod_usuario]);
        }
    }

    public function cadastrarFacilidade(Facilidade &$facilidade) {
        $facilidade->setEspaco($this);
        $facilidade->cadastrarEspaco();
    }

    /* public function alterarFacilidade(&$parecer, &$cod_facilidade) {
      if ($this->facilidades[$cod_facilidade] instanceof Facilidade) {
      $facilidade = $this->facilidades[$cod_facilidade];
      $facilidade->setParecer($parecer);
      $facilidade->alterarParecer();
      $this->facilidades[$cod_facilidade] = &$facilidade;
      }
      } */

    /* public function excluirFacilidade(&$cod_facilidade) {
      if ($this->facilidades[$cod_facilidade] instanceof Facilidade) {
      $this->facilidades[$cod_facilidade]->excluirParecer();
      unset($this->facilidades[$cod_facilidade]);
      }
      } */

    public function excluirFacilidades() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco_facilidade where cod_espaco = ?');
        $result = $link->execute($stmt, array($this->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function cadastrarFonteRecursos(FonteRecursos &$fonte_recursos) {
        $fonte_recursos->setEspaco($this);
        $fonte_recursos->cadastrarValor();
    }

    /* public function alterarFonteRecursos(&$valor, &$cod_fonte_recursos) {
      if ($this->fontes_recursos[$cod_fonte_recursos] instanceof FonteRecursos) {
      $fonte_recursos = $this->fontes_recursos[$cod_fonte_recursos];
      $fonte_recursos->setValor($valor);
      $fonte_recursos->alterarValor();
      $this->fontes_recursos[$cod_fonte_recursos] = &$fonte_recursos;
      }
      } */

    /* public function excluirFonteRecursos(&$cod_fonte_recursos) {
      if ($this->fontes_recursos[$cod_fonte_recursos] instanceof FonteRecursos) {
      $this->fontes_recursos[$cod_fonte_recursos]->excluirValor();
      unset($this->fontes_recursos[$cod_fonte_recursos]);
      }
      } */

    public function excluirFontesRecursos() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco_fonte_recursos where cod_espaco = ?');
        $result = $link->execute($stmt, array($this->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        $link->commit();
    }

    public function validarCod_registro(&$cod_registro) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_interno from objeto, espaco where objeto.cod_espaco = espaco.cod_espaco and objeto.cod_registro = ? and espaco.cod_espaco = ?', array($cod_registro, $this->cod_espaco));
        if (DB::isError($result)) {
            throw new Exception("Standard Message: {$result->getMessage()}<br>Standard Code: {$result->getCode()}<br>DBMS/User Message: {$result->getUserInfo()}<br>DBMS/Debug Message: {$result->getDebugInfo()}");
        }
        if ($result->numRows() > 0) {
            return false;
        }
        return true;
    }

}

?>